﻿using System;
using System.Collections.Generic;
using GSQ.BusinessEntities;
using GSQ.DataAccess;

namespace GSQ.BusinessLogic
{
    public class FacturasBL
    {
        public decimal Insert(FACTURAS value)
        {
            if (value.IsValid())
            {
                if (value.FACTURAS_DETALLES.Count == 0)
                { throw new ArgumentException("No puede crear FACTURAS sin agregar detalle"); }

                value.FECHA_HORA = new UtilidadesDA().GetDate();

                #region Validar
                if (value.ID_CONDICION == 1)
                {
                    CLIENTES c = new ClientesBL().GetById(value.ID_CLIENTE);
                    if (c.LIMITE_CREDITO == null || (c.MONTO_ADEUDADO + value.M_TOTAL) > c.LIMITE_CREDITO)
                        throw new Exception("Cliente no posee limite de credito para facturar.");
                    value.FECHA_VENCIMIENTO = value.FECHA_HORA.AddDays(Convert.ToDouble(new FormasPagosBL().GetById(value.CLIENTES.ID_FORMA_PAGO).PLAZO));
                }
                #endregion

                return new FacturasDA().Insert(value);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public decimal Update(FACTURAS newValue, FACTURAS oldValue)
        {
            if (newValue.IsValid())
            {
                if (newValue.FACTURAS_DETALLES.Count == 0)
                { throw new ArgumentException("No puede crear FACTURAS sin agregar detalle"); }

                return new FacturasDA().Update(newValue, oldValue);
            }
            else
                throw new ArgumentException("La entidad no esta valida");

        }

        public FACTURAS GetById(decimal id)
        {
            return new FacturasDA().GetById(id);
        }

        public List<FACTURAS> GetAll()
        {
            return new FacturasDA().GetAll();
        }

        public List<FACTURAS> GetByFechas(DateTime value1, DateTime value2)
        {
            return new FacturasDA().GetByFechas(value1.Date, value2.Date);
        }

        public List<FACTURAS> GetByIdCliente(decimal id)
        {
            return new FacturasDA().GetByCliente(id);
        }

        public List<FACTURAS> GetByCliente(string value)
        {
            return new FacturasDA().GetByCliente(value);
        }

        public List<FACTURAS> GetByNroFactura(decimal nroFactura)
        {
            return new FacturasDA().GetByNroFactura(nroFactura);
        }

        public List<FACTURAS> GetByFacturasPendientesPagos(decimal idCliente)
        {
            return new FacturasDA().GetByFacturasPendientesPagos(idCliente);
        }

        public bool Anular(FACTURAS entity)
        {
            if (!entity.ACTIVO)
                throw new Exception("Factura previamente anulada.");

            if (new FacturasPagosBL().GatByIdFactura(entity.ID).Count > 0 && !new UtilidadesBL().Get().ANULAR_FACTURAS_PAGADAS)
                throw new Exception("Factura no se puede anular ya que está pagada parcial o totalmente.\r\r Y la configuración de su compañia no admite este proceso bajo esta condición.");

            if (new NcBL().GetByIdFactura(entity.ID).Count > 0)
                throw new Exception("Factura no se puede anular porque tiene una nota de credito o devolución aplicada");

            return new FacturasDA().Anular(entity);

        }

        public bool PagarFactura(List<FACTURAS_PAGOS> value)
        {
            if (value == null || value.Count < 1)
                throw new Exception("Debe ingresar un detalle para realizar el pago.");
            return new FacturasDA().PagarFactura(value);
        }
    }
}
